/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package transervfx.Vista;

import java.io.IOException;
import java.net.URL;
import java.util.ResourceBundle;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.beans.property.Property;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;
import javafx.scene.control.ComboBox;
import javafx.scene.control.Control;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import javafx.util.Duration;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
import transervfx.Dato.Entidad.Comisionista;
import transervfx.Dato.Entidad.Domicilio;
import transervfx.Dato.Entidad.Localidad;
import transervfx.Dato.Entidad.Pais;
import transervfx.Dato.Entidad.Provincia;
import transervfx.Dato.Validacion.ValidacionesNivelBD;
import transervfx.Dato.Validacion.ValidacionesNivelLogico;
import transervfx.Logica.GestorComisionista;
import transervfx.Logica.GestorPais;
import transervfx.Vista.XML.pathRecusosFXML;
import utilidades.autocompletar.TextBoxAutoCompletar;
import utilidades.number.IntegerTextField;

/**
 * FXML Controller class
 *
 * @author silvi
 */
public class CrearComisionista extends VentanaModal {

    
    
    private Timeline locationUpdateTimeline;
    final static private int tiempoDeRespuesta = 500;
    

    //Datos personales
    @FXML
    private TextField apellido;
    @FXML
    private TextField nombres;
    @FXML
    private ComboBox<String> tipoDoc;
    @FXML
    private IntegerTextField nroDoc;
    @FXML
    private TextField calle;
    @FXML
    private IntegerTextField numero;
    @FXML
    private IntegerTextField piso;
    @FXML
    private TextField departamento;
    @FXML
    private IntegerTextField codigoPostal;
    @FXML
    private TextBoxAutoCompletar<Localidad> localidad;
    @FXML
    private ComboBox<Provincia> provincia;
    @FXML
    private ComboBox<Pais> pais;
    //Contacto
    @FXML
    private TextField telFijo1;
    @FXML
    private TextField telFijo2;
    @FXML
    private TextField telCelular1;
    @FXML
    private TextField telCelular2;
    @FXML
    private TextField email;
    //Datos fiscales
    @FXML
    private TextField cuit;
    @FXML
    private ComboBox<String> condicionFrenteIva;
    
    
    final ObservableList<Pais> dataSourcePais = FXCollections.observableArrayList();
    final ObservableList<Provincia> dataSourceProvincia = FXCollections.observableArrayList();
    final ObservableList<Localidad> dataSourceLocalidad = FXCollections.observableArrayList();
    
    
    private Comisionista comisionistaView = new Comisionista();
    private Domicilio domicilioView = new Domicilio();
    
    ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory();
    Validator validator = validatorFactory.getValidator();

    
    public CrearComisionista(Stage ventanaPadre,String titulo,int x, int y) {
        super( ventanaPadre, titulo, x,  y);
        initialize(null,null);
    }
    
   
    public void initialize(URL url, ResourceBundle rb) {

        try {

            this.cargarPaicesProvinciasLocalidades();
            
            this.tipoDoc.getSelectionModel().select(0);
            this.condicionFrenteIva.getSelectionModel().select(1);

            //Linqueo interfaz con bean
            this.bindingInterfazConBean(this.comisionistaView, this.domicilioView);

            //Defino escuchadores
            this.apellido.textProperty().addListener(this.escuchadorInput);
            this.nombres.textProperty().addListener(this.escuchadorInput);
            this.nroDoc.textProperty().addListener(this.escuchadorInput);
            this.tipoDoc.valueProperty().addListener(this.escuchadorInput);

            this.telCelular1.textProperty().addListener(this.escuchadorInput);
            this.telCelular2.textProperty().addListener(this.escuchadorInput);
            this.telFijo1.textProperty().addListener(this.escuchadorInput);
            this.telFijo2.textProperty().addListener(this.escuchadorInput);
            this.email.textProperty().addListener(this.escuchadorInput);

            //this.cuit.textProperty().addListener(this.escuchadorInput);
            this.condicionFrenteIva.valueProperty().addListener(this.escuchadorInput);


            this.calle.textProperty().addListener(this.escuchadorInputDomicilio);
            this.departamento.textProperty().addListener(this.escuchadorInputDomicilio);
            this.piso.textProperty().addListener(this.escuchadorInputDomicilio);
            this.numero.textProperty().addListener(this.escuchadorInputDomicilio);

        } catch (NoSuchMethodException ex) {
            Logger.getLogger(CrearComisionista.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    
    
    private void bindingInterfazConBean(Comisionista comisionistaView, Domicilio domicilioView) throws NoSuchMethodException {

        //Propios de comisionista
        comisionistaView.getPROP_NOMBRES().bind(nombres.textProperty());
        comisionistaView.getPROP_APELLIDO().bind(apellido.textProperty());
        comisionistaView.getPROP_TIPODOC().bind(tipoDoc.getSelectionModel().selectedItemProperty());
        comisionistaView.getPROP_NRODOC().bind(nroDoc.numberProperty());

        //Heredado de persona
        comisionistaView.getPROP_TELCELULAR1().bind(telCelular1.textProperty());
        comisionistaView.getPROP_TELCELULAR2().bind(telCelular2.textProperty());
        comisionistaView.getPROP_TELFIJO1().bind(telFijo1.textProperty());
        comisionistaView.getPROP_TELFIJO2().bind(telFijo2.textProperty());
        comisionistaView.getPROP_EMAIL().bind(email.textProperty());

        comisionistaView.getPROP_CONDICIONFRENTEIVA().bind(condicionFrenteIva.getSelectionModel().selectedItemProperty());


        //Propios del domicilio
        domicilioView.getPROP_CALLE().bind(calle.textProperty());
        domicilioView.getPROP_NUMERO().bind(numero.numberProperty());
        domicilioView.getPROP_PISO().bind(piso.numberProperty());
        domicilioView.getPROP_DEPARTAMENTO().bind(departamento.textProperty());

    }
    
    
    private void cargarPaicesProvinciasLocalidades() {

        localidad.setData(dataSourceLocalidad);
        provincia.setItems(dataSourceProvincia);
        dataSourcePais.addAll(GestorPais.getInstance().paises());
        pais.setItems(dataSourcePais);


        provincia.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<Provincia>() {
            @Override
            public void changed(ObservableValue<? extends Provincia> selected, Provincia oldValue, Provincia newValue) {
                if (newValue != null) {
                    localidad.setText("");
                    localidad.setData(GestorPais.getInstance().localidades(newValue));

                    //dataSourceProvincia.clear();
                    //dataSourceProvincia.addAll( GestorPais.getInstance().provincias(newValue));
                }
            }
        });


        pais.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<Pais>() {
            @Override
            public void changed(ObservableValue<? extends Pais> arg0, Pais arg1, Pais arg2) {
                if (arg2 != null) {
                    System.out.println("selecciono pais " + arg2.getId());
                    dataSourceProvincia.clear();
                    dataSourceProvincia.addAll(GestorPais.getInstance().provincias(arg2));
                }
            }
        });

        pais.getSelectionModel().select(0);
        provincia.getSelectionModel().select(21);
    }

    
    
    
    
    // Boton Aceptar
    public void aceptarEvent() throws NoSuchMethodException, IOException {

        System.out.println(comisionistaView.getNombres());

        Class nL = ValidacionesNivelLogico.class;
        Class nBD = ValidacionesNivelBD.class;


        if (validarCampos()) {

            Localidad loc = this.localidad.getValue();

            if (loc != null) {

                this.domicilioView.setLocalidad(loc);

                this.comisionistaView.setDomicilio(this.domicilioView);

                GestorComisionista.getInstance().guardarComisionista(comisionistaView);

                System.out.println("Comisionista guardado");
                this.close();
            } else {

                System.out.println("NO GUARDADO");

            }
        }
    }

    public void cancelarEvent(ActionEvent event) {
        System.out.println(((Button) event.getSource()).getText());
        this.close();
    }

    private boolean validarCampos() {
        return true;
    }
    
    
    
    ChangeListener escuchadorInput = new ChangeListener<String>() {
        @Override
        public void changed(ObservableValue observableValue, String s, String s1) {

            if (!s1.equals(s)) {
                // delay location updates to we don't go too fast file typing
                final Control control = ((Control) ((Property) observableValue).getBean());

                // si esta corriendo lo detengo
                if (locationUpdateTimeline != null) {

                    locationUpdateTimeline.stop();
                }

                locationUpdateTimeline = new Timeline();
                locationUpdateTimeline.getKeyFrames().add(
                        new KeyFrame(new Duration(tiempoDeRespuesta),
                        new EventHandler<ActionEvent>() {
                            @Override
                            public void handle(ActionEvent actionEvent) {
                                System.out.println("locationUpdateTimeline " + locationUpdateTimeline.getDelay());

                               
                                System.out.println("NOMBRE"+nombres.getText());
                                //solo valido a nivel logico
                                //validar(control, ValidacionesNivelLogico.class, null);
                            }
                        }));
                locationUpdateTimeline.play();

            }

        }
    };
    
    ChangeListener escuchadorInputDomicilio = new ChangeListener<String>() {
        @Override
        public void changed(
                ObservableValue observableValue,
                String s, String s1) {

            if (!s1.equals(s)) {
                // delay location updates to we don't go too fast file typing
                final Control control = ((Control) ((Property) observableValue).getBean());


                if (locationUpdateTimeline != null) {

                    locationUpdateTimeline.stop();
                }

                locationUpdateTimeline = new Timeline();
                locationUpdateTimeline.getKeyFrames().add(
                        new KeyFrame(new Duration(tiempoDeRespuesta),
                        new EventHandler<ActionEvent>() {
                            @Override
                            public void handle(ActionEvent actionEvent) {
                                System.out.println("locationUpdateTimeline " + locationUpdateTimeline.getDelay());

                                //solo valido a nivel logico
                                //validarDomicilio(control, ValidacionesNivelLogico.class);
                            }
                        }));
                locationUpdateTimeline.play();

            }

        }
    };

    @Override
    URL getURLFXML() {
        return pathRecusosFXML.class.getResource("CrearComisionistaFXML.fxml");
    }

}
